/**
 * Name: clojure
 * Description: Clojure programming language.
 * Author: Mike Meyer <mwm@mired.org>
 */

state clojure extends HighlightEntry
{
  BEGIN {
    /*
     * Modify regexp character syntax so that we can distinguish all
     * clojure symbols.
     */
    extras = list ('+', '-', '!', '*', '/', '?', '.', '>');
    for (i = 0; i < length (extras); i = i + 1)
      regexp_syntax (extras[i], 'w');
  }

  /* Comments. */
  /;/ {
    comment_face (true);
    language_print ($0);
    call (eat_one_line);
    comment_face (false);
  }

  /* String constants. */
  /([^\\\])(\")/ {
    language_print ($1);
    string_face (true);
    language_print ($2);
    call (c_string);
    string_face (false);
  }

  /* Definitions. */
  /(\([ \t]*)(def(|n|macro|multi|method|once|struct)-?)([ \t]+\(?)([!\*\/\?_+\-\.^a-zA-Z][!\*\/\?_^a-zA-Z0-9.+\-]*)/ {
    /* Starting garbage. */
    language_print ($1);

    /* Keyword `def*'. */
    keyword_face (true);
    language_print ($2);
    keyword_face (false);

    /* Middle garbage. */
    language_print ($4);

    /* Function name. */
    function_name_face (true);
    language_print ($5);
    function_name_face (false);
  }

  /* ':'-names, Emacs highlights these, so do we. */
  /(\W)(:[!\*\/\?_^a-zA-Z0-9.+\-]*)/ {
    language_print ($1);
    reference_face (true);
    language_print ($2);
    reference_face (false);
  }

  /* Special forms */
  /\W(if|do|let|quote|var|fn|map\?|loop|recur|throw|try|monitor-enter|monitor-exit)\b/ {
    keyword_face (true);
    language_print ($0);
    keyword_face (false);
  }

  /* Built-in function invocations */
    /(\([ \t]*)(\*|\*1|\*2|\*3|\*agent\*|\*allow-unresolved-vars\*|\*assert\*|\*clojure-version\*|\*command-line-args\*|\*compile-files\*|\*compile-path\*|\*core-java-api\*|\*current\*|\*e|\*err\*|\*feeling-lucky\*|\*feeling-lucky-url\*|\*file\*|\*flush-on-newline\*|\*in\*|\*local-javadocs\*|\*math-context\*|\*ns\*|\*open-url-script\*|\*out\*|\*print-base\*|\*print-dup\*|\*print-length\*|\*print-level\*|\*print-meta\*|\*print-miser-width\*|\*print-pprint-dispatch\*|\*print-pretty\*|\*print-radix\*|\*print-readably\*|\*print-right-margin\*|\*print-suppress-namespaces\*|\*read-eval\*|\*remote-javadocs\*|\*sb\*|\*sh-dir\*|\*sh-env\*|\*source-path\*|\*stack\*|\*state\*|\*use-context-classloader\*|\*warn-on-reflection\*|+|\-|\->|\->>|\-cache-protocol-fn|\-reset-methods|\.\.|\/|<|<=|=|==|>|>=|Coercions|EMPTY-NODE|IOFactory|InternalReduce|accessor|aclone|add-classpath|add-local-javadoc|add-remote-javadoc|add-watch|agent|agent-error|agent-errors|aget|alength|alias|all-ns|alter|alter-meta!|alter-var-root|amap|ancestors|and|append-child|apply|apropos|areduce|arr-impl|array-map|as-file|as-relative-path|as-url|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|assoc!|assoc-in|associative\?|atom|attrs|await|await-for|await1|bases|bean|bigdec|bigint|binding|bit-and|bit-and-not|bit-clear|bit-flip|bit-not|bit-or|bit-set|bit-shift-left|bit-shift-right|bit-test|bit-xor|boolean|boolean-array|booleans|bound-fn|bound-fn\*|bound\?|branch\?|browse-url|butlast|byte|byte-array|bytes|case|cast|char|char-array|char-escape-string|char-name-string|char\?|chars|children|chunk|chunk-append|chunk-buffer|chunk-cons|chunk-first|chunk-next|chunk-rest|chunked-seq\?|cl-format|class|class\?|clear-agent-errors|clojure-version|code-dispatch|coll\?|comment|commute|comp|comparator|compare|compare-and-set!|compile|complement|completions|concat|cond|condp|conj|conj!|cons|constantly|construct-proxy|contains\?|content|content-handler|copy|count|counted\?|create-ns|create-struct|cycle|dec|decimal\?|declare|default-streams-impl|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defprotocol|defrecord|defstruct|deftype|delay|delay\?|delete-file|deliver|denominator|deref|derive|descendants|destructure|difference|dir|dir-fn|disj|disj!|dissoc|dissoc!|distinct|distinct\?|doall|doc|dorun|doseq|dosync|dotimes|doto|double|double-array|doubles|down|drop|drop-last|drop-while|edit|element|emit|emit-array-impls|emit-element|empty|empty\?|end\?|ensure|enumeration-seq|error-handler|error-mode|eval|even\?|every\?|exit|extend|extend-protocol|extend-type|extenders|extends\?|false\?|ffirst|file|file-seq|filter|find|find-doc|find-ns|find-protocol-impl|find-protocol-method|find-var|first|flatten|float|float-array|float\?|floats|flush|fn|fn\?|fnext|fnil|for|force|format|formatter|formatter-out|frequencies|fresh-line|future|future-call|future-cancel|future-cancelled\?|future-done\?|future\?|gen-class|gen-interface|gensym|get|get-in|get-method|get-pretty-writer|get-proxy-class|get-thread-bindings|get-validator|group-by|hash|hash-combine|hash-map|hash-set|identical\?|identity|if-let|if-not|ifn\?|import|in-ns|inc|index|init-proxy|input-stream|insert-child|insert-left|insert-right|instance\?|int|int-array|integer\?|interleave|intern|internal-reduce|interpose|intersection|into|into-array|ints|io!|isa\?|iterate|iterator-seq|javadoc|join|juxt|keep|keep-indexed|key|keys|keyword|keyword\?|last|lazy-cat|lazy-seq|left|leftmost|lefts|let|letfn|line-seq|list|list\*|list\?|load|load-file|load-reader|load-script|load-string|loaded-libs|locking|long|long-array|longs|loop|macroexpand|macroexpand-1|main|make-array|make-hierarchy|make-input-stream|make-node|make-output-stream|make-parents|make-reader|make-writer|map|map-indexed|map-invert|map\?|mapcat|max|max-key|memfn|memoize|merge|merge-with|meta|method-sig|methods|min|min-key|mod|munge|name|namespace|namespace-munge|neg\?|newline|next|next|nfirst|nil\?|nnext|node|not|not-any\?|not-empty|not-every\?|not=|ns|ns-aliases|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unalias|ns-unmap|nth|nthnext|num|number\?|numerator|object-array|odd\?|or|output-stream|parents|parse|partial|partition|partition-all|partition-by|path|pcalls|peek|persistent!|pmap|pop|pop!|pop-thread-bindings|pos\?|pp|pprint|pprint-indent|pprint-logical-block|pprint-newline|pprint-tab|pr|pr-str|prefer-method|prefers|prev|primitives-classnames|print|print-ctor|print-doc|print-dup|print-method|print-namespace-doc|print-simple|print-special-doc|print-str|printf|println|println-str|prn|prn-str|project|promise|proxy|proxy-call-with-super|proxy-mappings|proxy-name|proxy-super|push-thread-bindings|pvalues|quot|rand|rand-int|rand-nth|range|ratio\?|rational\?|rationalize|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|read-string|reader|reduce|reductions|ref|ref-history-count|ref-max-history|ref-min-history|ref-set|refer|refer-clojure|reify|release-pending-sends|rem|remove|remove|remove-all-methods|remove-method|remove-ns|remove-watch|rename|rename-keys|repeat|repeatedly|repl|repl-caught|repl-exception|repl-prompt|repl-read|replace|replace|replicate|require|reset!|reset-meta!|resolve|resource|rest|restart-agent|resultset-seq|reverse|reversible\?|right|rightmost|rights|root|rseq|rsubseq|satisfies\?|save-completions-to|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|seque|sequence|sequential\?|set|set-error-handler!|set-error-mode!|set-pprint-dispatch|set-validator!|set\?|sh|short|short-array|shorts|shuffle|shutdown-agents|simple-dispatch|skip-if-eol|skip-whitespace|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|sorted-set-by|sorted\?|source|source-fn|special-form-anchor|special-symbol\?|spit|split-at|split-with|startparse-sax|str|string\?|struct|struct-map|subs|subseq|subset\?|subvec|supers|superset\?|swap!|symbol|symbol\?|sync|syntax-symbol-anchor|tag|take|take-last|take-nth|take-while|test|the-ns|thread-bound\?|time|to-array|to-array-2d|trampoline|transient|tree-seq|true\?|type|unchecked-add|unchecked-dec|unchecked-divide|unchecked-inc|unchecked-multiply|unchecked-negate|unchecked-remainder|unchecked-subtract|underive|union|unquote|unquote-splicing|up|update-in|update-proxy|use|val|vals|var-get|var-set|var\?|vary-meta|vec|vector|vector-of|vector-zip|vector\?|when|when-first|when-let|when-not|while|with-bindings|with-bindings|with-bindings\*|with-in-str|with-loading-context|with-local-vars|with-meta|with-open|with-out-str|with-pprint-dispatch|with-precision|with-sh-dir|with-sh-env|write|write-out|writer|xml-seq|xml-zip|zero\?|zipmap|zipper)\b/ {
    language_print ($1);
    function_name_face (true);
    language_print ($2);
    function_name_face (false);
  }

}


/*
Local variables:
mode: c
End:
*/
